#ifndef IMAGEALGORITHMPROCESSINGFORM_H
#define IMAGEALGORITHMPROCESSINGFORM_H

#include <QWidget>
#include <QMap>
#include <QString>
#include <QVBoxLayout>
#include <QScrollArea>
#include <QButtonGroup>
#include <QVariant>
#include <QVariantMap>

namespace Ui {
class ImageProcessingWidget;
}

class ImageAlgorithmButton;

/**
 * @brief 图像处理widget类
 * 提供图像处理算法的用户界面，包括算法按钮显示、参数设置面板
 * 和用户交互处理功能，是插件与用户交互的核心组件
 */
class ImageProcessingWidget : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * 初始化UI组件、按钮组和映射容器
     * @param parent 父窗口指针
     */
    explicit ImageProcessingWidget(QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数
     * 清理UI资源和动态分配的内存
     */
    ~ImageProcessingWidget();
    
    /**
     * @brief 启用或禁用所有算法按钮
     * 当没有选中图像时禁用，选中图像后启用
     * @param enable 启用状态，true为启用，false为禁用
     */
    void enableAllAlgorithmButtons(bool enable);
    
    /**
     * @brief 设置特定算法的处理状态
     * 更新算法按钮的UI状态，显示该算法是否已应用于当前图像
     * @param algorithmName 算法名称
     * @param isProcessed 是否已处理状态，true表示已处理，false表示未处理
     */
    void setIsProcessed(const QString& algorithmName, bool isProcessed);
    
    /**
     * @brief 恢复所有按钮状态
     * 将所有算法按钮的checked状态设为false，并隐藏对应的参数设置面板
     */
    void resetAllButtonsState();

public slots:
    /**
     * @brief 处理算法参数设置widget就绪信号
     * 当算法管理器加载并初始化算法参数设置界面时调用
     * @param algorithmName 算法名称
     * @param widget 参数设置widget指针，可为nullptr
     * @param iconPath 算法图标路径
     */
    void onAlgorithmWidgetReady(const QString& algorithmName, QWidget* widget, const QString& iconPath);
    
    /**
     * @brief 选择指定的算法按钮
     * 以编程方式选中特定的算法按钮，但不会触发图像处理事件
     * @param algorithmName 要选中的算法名称
     */
    void selectAlgorithmButton(const QString& algorithmName);
       
signals:
    /**
     * @brief 发送图像处理请求信号
     * 当用户点击算法按钮时发出，通知插件执行相应的图像处理
     * @param algorithmName 请求处理的算法名称
     * @param parameters 处理参数，默认空参数映射
     */
    void processImageRequested(const QString& algorithmName, const QVariantMap& parameters = QVariantMap());

private:
    /**
     * @brief UI设计器生成的界面对象
     */
    Ui::ImageProcessingWidget *ui;
    
    /**
     * @brief 按钮组
     * 用于管理算法按钮的互斥行为，确保一次只能选择一个算法
     */
    QButtonGroup *m_buttonGroup;

    /**
     * @brief 算法按钮映射
     * 存储算法名称到算法按钮对象的映射关系
     */
    QMap<QString, ImageAlgorithmButton*> m_algorithmButtons;
    
    /**
     * @brief 算法参数界面映射
     * 存储算法名称到其参数设置widget的映射关系
     */
    QMap<QString, QWidget*> m_algorithmWidgets;
};

#endif // IMAGEALGORITHMPROCESSINGFORM_H
